package com.lnj.messages.utiles;

import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch.core.IndexRequest;
import com.lnj.bean.dto.ProductDTO;
import com.lnj.bean.dto.ProductVectorDTO;
import dev.langchain4j.model.embedding.EmbeddingModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.List;

@Component
@Slf4j
public class VectorUtil {
    @Autowired
    private EmbeddingModel embeddingModel;
    @Autowired
    private ElasticsearchClient elasticsearchClient;

    // 存储向量数据到ES
    public void storeVectorData(ProductDTO productDTO) {
        try {
            // 为每个字段单独进行向量化处理
            // 商品名称向量化
            String productInfo = String.format(
                    "商品ID: %d, 商品名称: %s, 分类名称: %s, 商品详情: %s, 当前价格: %.2f, 原价: %.2f",
                    productDTO.getProductId(),
                    productDTO.getProductName(),
                    productDTO.getCategoryName(),
                    productDTO.getDetail(),
                    productDTO.getPrice(),
                    productDTO.getOriginalPrice()
            );
            List<Float> productVector = vectorizeSingleField(productInfo);


            // 转换为ProductVectorDTO
            ProductVectorDTO vectorDTO = new ProductVectorDTO();
            vectorDTO.setProductId(productDTO.getProductId());
            vectorDTO.setProductVector(productVector);

            // 存储到向量索引
            IndexRequest<ProductVectorDTO> request = IndexRequest.of(b -> b
                    .index("product_vectors")
                    .id(productDTO.getProductId().toString())
                    .document(vectorDTO)
            );
            elasticsearchClient.index(request);
        } catch (Exception esEx) {
            log.error("向量数据存储到ES失败: {}", productDTO.getProductId(), esEx);
            // 可以加入重试队列
        }
    }


    /**
     * 对单个字段进行向量化处理
     * @param text 待向量化的文本
     * @return 向量结果
     */
    private List<Float> vectorizeSingleField(String text) {
        if (text == null || text.isEmpty()) {
            // 返回零向量或默认向量
            return Collections.nCopies(5120, 0.0f); // 假设向量维度为5120
        }

        // 这里调用你的实际向量化方法
        return embeddingModel.embed(text).content().vectorAsList();

    }
}
